09. 单精度和双精度浮点数[示范区]

单精度和双精度浮点数

在最后一部分,你看到了一张包括基础的 C++ 数据类型及其声明的表:

数据类型 声明
整数 int
单精度浮点数 float
双精度浮点数 double
字符 char
布尔型 bool
无值型 void

单精度和双精度浮点数究竟有何区别?

小测试:单精度浮点数 vs 双精度浮点数

单精度浮点数 vs 双精度浮点数

下面关于单精度和双精度浮点数的说法,哪些是正确的?

SOLUTION:
  • 单精度在小数点后有7位有效数字,而双精度有15位。
  • 通常来说,使用双精度会减少舍入误差。
  • 双精度能用于表示更大的数字。

两种数据类型都可以表述包括小数点的数字:

float x = 5.79;

以及

double x = 5.79;

但是,双精度浮点数包括的位数是单精度浮点数的两倍。但有利有弊:它所需的存储空间也同样翻倍。

在下面的演示中,你可以看到,有时候存储更多的位数非常重要,尤其是在精确度要求比较高的情况下。

演示:单精度浮点数 vs 双精度浮点数定义

下面的代码会向你展示单精度和双精度浮点数类型之间的区别。这段代码将 11.0 赋值给了一个单精度浮点数变量和一个双精度浮点数变量。接下来,每个变量都除以 10 万。

然后,通过一个 for 循环将每个变量重复求和 10 万次,查看两个变量的结果和 11.0 相差多少。你会看到,两个变量求和的结果都不是 11.0,因为内存只能保留有限的小数点位数。但是,双精度浮点数的结果更接近 11.0。

完整阅读这段代码,然后点击“测试运行”按钮,查看演示的输出结果。

Start Quiz:

#include <stdio.h>

int main() {
    
    // define floating point numbers    
    float float_num;
    float float_sum = 0;

    double double_num;
    double double_sum = 0;

    int divisions = 100000;

    // divide the floating point numbers by divisions
    float_num = 11.0/divisions;
    double_num = 11.0/divisions;

    // sum the number by the number of divisions to see how close the results
    // get to 11.0
    for (int i = 0; i < divisions; i++) {
        float_sum = float_sum + float_num;
        double_sum = double_sum + double_num;

    }
    
    printf("Floating point sum: %.15g\n", float_sum);
    printf("Double sum: %.15g\n", double_sum);

    return 0;
}